package com.itheima.admin.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.admin.pojo.AdUser;
import com.itheima.admin.mapper.AdUserMapper;
import com.itheima.admin.service.AdUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.common.exception.LeadNewsException;
import com.itheima.common.util.AppJwtUtil;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import javax.naming.Name;
import java.util.HashMap;
import java.util.Map;
//1. 参数校验, 获取参数的值
//1.1 不通过，参数不能为空
//2. 通过用户名查询数据库
//3. 是否存在的判断
//3.1 不存在，报错 用户名或密码错误, 能不能 报 用户名不存在？ 前端换个用户名再提交，最终就得到真正用户名，别人的。
//4. 密码校验
//4.1 把前端的密码加盐加密
//4.2 比较加密后的密码与数据库的密码是否相同
//4.3 不同，则报错 用户名或密码错误
//5. 生成token
//6. 构建返回的数据
/**
 * @version 1.0
 * @description <p>管理员用户信息 业务实现</p>
 * @package com.itheima.admin.service.impl
 */
@Service
public class AdUserServiceImpl extends ServiceImpl<AdUserMapper, AdUser> implements AdUserService {

    @Override
    public Map<String, Object> landing(Map<String, String> paramMap) {
        //1. 参数校验, 获取参数的值
        String name = paramMap.get("name");
        String password = paramMap.get("password");
        //1.1 不通过，参数不能为空
        if (StringUtils.isEmpty(name) || StringUtils.isEmpty(password)){
            throw new LeadNewsException("账号与密码不能为空!");
        }
        //2. 通过用户名查询数据库
        /*LambdaQueryWrapper<AdUser> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(AdUser::getName, name);
        AdUser adUser = getBaseMapper().selectOne(wrapper);**/
        AdUser one = query().eq("name", name).one();
        //3. 是否存在的判断
        if(null==one){
            //3.1 不存在，报错 用户名或密码错误, 能不能 报 用户名不存在？ 前端换个用户名再提交，最终就得到真正用户名，别人的。
            throw  new LeadNewsException("用户账号不存在");
        }
        //4. 密码校验
        String salt = one.getSalt();
        //4.1 把前端的密码加盐加密
        String digest = DigestUtils.md5DigestAsHex((password + salt).getBytes());
        //4.2 比较加密后的密码与数据库的密码是否相同
        if(!digest.equals(one.getPassword())){
            //4.3 不同，则报错 用户名或密码错误
            throw new LeadNewsException("用户密码错误");
        }
        String token = AppJwtUtil.createToken(one.getId());
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("token",token);
        one.setSalt(null);
        one.setPassword(null);
        hashMap.put("user",one);

        return hashMap;
    }
}
